<?php

/**
 * Description of x10_JSON
 *
 * @author prometheus
 */
class x10_Util_JSON
{
	/**
	 * PHP objektum vagy primitív.
	 * @var mixed
	 */
	protected $object;

	/**
	 * Objektum vagy primitív JSON formátumban.
	 * @var String
	 */
	protected $jsonData = 'null';

	/**
	 * JSON fájl elérési útja (opc.).
	 * @var String
	 */
	protected $pathToJSON = '';
	
	/**
	 *
	 * @param mixed $data 
	 * @param Bool $asArray
	 */
	public function __construct($data, $asArray=FALSE)
	{
		$this->set($data, $asArray);
	}

	public function set($data, $asArray=FALSE)
	{
		$url = new x10_Util_URL($data);
		if ($url->isValid())
		{
			$this->pathToJSON = (string)$url;
			if (file_exists($this->pathToJSON) and is_file($this->pathToJSON) and is_readable($this->pathToJSON))
			{
				$this->jsonData = file_get_contents($this->pathToJSON);
				$this->object = json_decode($this->jsonData, $asArray);
			}
		}
		else
		{
			$this->pathToJSON = '';

			if ($data === 'null')
			{
				$this->object = NULL;
				$this->jsonData = $data;
			}
			else if (is_string($data) and !is_null($object = json_decode($data, $asArray)))
			{
				$this->object = $object;
				$this->jsonData = $data;
			}
			else
			{
				$this->object = $data;
				$this->jsonData = json_encode($this->object);
			}
		}

		if (function_exists('json_last_error'))
		{ // PHP >= 5.3.0
			$error = json_last_error();
			switch ($error)
			{
				case 1 /* JSON_ERROR_DEPTH */:
				{
					$error = 'Az objektum mélysége túllépte a megengedettet.';
					break;
				}
				case 2 /* JSON_ERROR_STATE_MISMATCH */:
				{
					$error = 'Hiányzik az állapot. Jelentsen ez bármit is.';
					break;
				}
				case 3 /* JSON_ERROR_CTRL_CHAR */:
				{
					$error = 'Nem várt vezérlő karaktert tartalmaz az objektum.';
					break;
				}
				case 4 /* JSON_ERROR_SYNTAX */:
				{
					$error = 'Szintaktikai hiba van az objektumban.';
					break;
				}
			}

			if ($error !== 0) throw new x10_E_Util_JSON_GeneralError($error);
		}

		return $this;
	}

	public function get()
	{
		return $this->object;
	}

	public function __toString()
	{
		return $this->jsonData;
	}
}

?>